package pl.wroc.pwr.mss.server.ui.tables.models;

import javax.swing.table.AbstractTableModel;

import pl.wroc.pwr.mss.logic.domain.Playlist;
import pl.wroc.pwr.mss.logic.domain.Song;
import pl.wroc.pwr.mss.server.service.SongService;

/**
 * Model danych dla tabeli edycji utworów.
 * 
 * @author mjagus
 */
public class SongEditTableModel extends AbstractTableModel
{
    /**
     * Identyfikator klasy.
     */
    private static final long serialVersionUID = 2575631578608126817L;

    /**
     * Tablica nazw kolumn.
     */
    private static final String[] columnNames = {"Artist", "Album", "Track No", "Title", "Duration"};

    /**
     * Playlista ktorej utwory beda wyswietlane na tej tabeli.
     */
    private Playlist playlist;

    /**
     * Serwis dla encji Song.
     */
    private SongService songService;

    /**
     * Iniciuje model.
     */
    public SongEditTableModel()
    {
        super();
    }

    @Override
    public Class<?> getColumnClass(int columnIndex)
    {
        return String.class;
    }

    @Override
    public int getColumnCount()
    {
        return columnNames.length;
    }

    @Override
    public String getColumnName(int columnIndex)
    {
        return columnNames[columnIndex];
    }

    @Override
    public int getRowCount()
    {
        if(playlist != null)
            return playlist.getSongs().size();
        else
            return 0;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex)
    {
        Song song = playlist.getSongs().get(rowIndex);

        switch(columnIndex)
        {
        case 0:
            return song.getArtist();
        case 1:
            return song.getAlbum();
        case 2:
            return song.getTrackNo() != null? String.format("%d", song.getTrackNo()) : null;
        case 3:
            return song.getTitle();
        case 4:
            Long duration = song.getDuration();
            long seconds = duration % 60;
            long minutes = duration / 60;
            return String.format("%d:%02d", minutes, seconds);
        default:
            return null;
        }
    }

    /**
     * Pozwala na edycje wszystkich komórek tabeli poza tymi, znajdującymi się
     * w kolumnie z czasami utworów.
     * 
     * @param rowIndex Numer sprawdzanego wiersza
     * @param columnIndex Numer sprawdzanej kolumny
     * @return Informacja czy komórka w danym wierszu i kolumnie jest edytowalna.
     */
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex)
    {
        return columnIndex < 4;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex)
    {
        Song song = playlist.getSongs().get(rowIndex);

        switch(columnIndex)
        {
        case 0:
            song.setArtist((String)aValue);
            break;
        case 1:
            song.setAlbum((String)aValue);
            break;
        case 2:
            try {
                song.setTrackNo(Integer.parseInt((String)aValue));
            } catch(NumberFormatException e) {
                song.setTrackNo(null);
            }
            break;
        case 3:
            song.setTitle((String)aValue);
            break;
        default:
            break;
        }

        songService.updateID3Tags(song);
    }

    /**
     * @return Playlista powiazana z tym modelem danych
     */
    public Playlist getPlaylist()
    {
        return playlist;
    }

    /**
     * @param playlist Playlista ktora zostanie powiazana z tym modelem danych
     */
    public void setPlaylist(Playlist playlist)
    {
        this.playlist = playlist;
        super.fireTableDataChanged();
    }

    /**
     * @return Serwis dla encji Song
     */
    public SongService getSongService()
    {
        return songService;
    }

    /**
     * @param songService Serwis dla encji Song
     */
    public void setSongService(SongService songService)
    {
        this.songService = songService;
    }
}
